---
id: 接口
title: 接口类型
---

接口是面向对象中一个很重要的概念，是对一类属性的描述（抽象），不实现具体代码。

如果你没有接触过这个可能不是好理解，比如下面这段代码，我们定义了一个 userInfo 的接口，接口内的信息有 name，age，sex……，后面操作的所有变量只要符合接口内容时都可以使用，
我们创建一个用户时就可以使用这个接口，同时还有约束能力。

```ts
interface UserInfo {
    readonly name:string;
    age:number;
    sex?:number;
    add: (name: string, age: number) => boolean;
    [propName:string]:any
  }
  // 函数使用
  function createUser(userinfo:UserInfo){}
  
  // 变量使用
  let user:UserInfo = {name:'张三', age:19, add(name:string, age: number) {return true}}
```

** 一般接口名称首字母大写 **  
** readonly 表示只读属性，如果对它进行赋值，则会报错 ** 
** ? 问号代表这个属性可以没有。否则是一定要实现的**  
** [ ] 允许接口中有一个任意属性，一个接口中只能有一个任意属性**  propName相当于是个参数，可随意写。string 表示键名是string类型。any 表示值类型。
## 使用接口表示数组

```ts
interface StringArray {
  [index: number]: string;
}

let myFriend: StringArray = ["张三", "李四"];

console.log(myFriend[0])
```

StringArray 表示：只要索引的类型是数字时，那么值的类型必须是字符串。
我们一般不会这么做，这种方式比较复杂。

ts 提供的类数组用的就是这个方法。
## 类数组
ts 内置了arguments 的类型: IArguments。实际上就是

```ts
// ts 内置类型
interface IArguments {
    [index: number]: any;
    length: number;
    callee: Function;
}
```
```ts
// arguments 上可直接使用
function fn() {
  let args: IArguments = arguments;
}

```

## 接口扩展
### 自动合并
```ts 
interface userInfo {
  readonly name: string;
  age: number;
};

interface userInfo { school:string}

let user: userInfo = { name: "张三", age: 2 ,school:'张三的母校'};
```

以下自动错误会报错
试图改写上一个接口中的age类型是不允许的。两个age类型一致才会正确通过编译。

```ts 
interface userInfo {
  age: number;
}

interface userInfo {
  age: string;
}
// 报错
// Subsequent property declarations must have the same type.  Property 'age' must be of type 'number', but here has type 'string'.
```


### extends 关键字
```ts 
interface userInfo {
  readonly name: string;
  age: number;
};

interface extraInfo  extends userInfo {
    school: string
}

let user: extraInfo = { name: "张三", age: 2 ,school:'张三的母校'};
```

